/**
 * @file MyRedux.tsx - Redux核心功能的简化实现
 * @description
 * @author xiaoyi
 * 实现Redux的核心功能，包括：
 * - createStore: 创建一个Redux store
 * - getState: 获取当前状态
 * - dispatch: 派发action更新状态
 * - subscribe: 订阅状态变化
 * 
 * 这是一个教学用途的简化版本，实现了Redux的基本功能和错误处理
 */
export const createStore = (reducer: any) => {
	//reducer必须是一个函数
	if (typeof reducer !== 'function') {
		throw new Error('reducer must be a function')
	}
	let state: any,
		listeners: any[] = []
	//获取公共状态
	const getState = () => {
		return state
	}
	//向时间池中加入让组件更新的方法	
	const subscribe = (listener: any) => {
		if (typeof listener !== 'function') {
			throw new Error('listener must be a function')
		}
		if (!listeners.includes(listener)) {
			listeners.push(listener)
		}
		//返回一个取消订阅的方法
		return () => {
			listeners = listeners.filter((l: any) => l !== listener)
		}
	}
	//派发任务通知REDUCER执行
	const dispatch = (action: any) => {
		//action必须是一个对象
		if (typeof action !== 'object' || action === null) {
			throw new Error('action must be a plain object')
		}
		//action必须有一个type属性
		if (typeof action.type !== 'string' && typeof action.type !== 'symbol') {
			throw new Error('action.type must be a string or symbol')
		}
		//派发任务通知REDUCER执行,传递公共状态，接收执行返回值，替换公共状态
		state = reducer(state, action)
		//通知组件更新
		listeners.forEach((listener: any) => listener())

		return action
	}

	//redux内部会默认派发一个初始化动作，目的是为了初始化公共状态
	dispatch({ type: Symbol() })

	//返回创建的STORE对象
	return { getState, subscribe, dispatch }
}

